# coding:utf-8
'''
Created on 2011-3-28
Python的名字空间：
Python使用叫做名字空间的东西来记录变量的轨迹。名字空间只是一个directory，它的key是变量名，value是变量的值。
实际上名字空间可以像Python的directory一样进行访问。
在每一个Python程序中的任何一个地方，都存在几个可用的名字空间。
● 每个函数都有自己的名字空间，叫局部名字空间。它记录
了函数的变量，包括函数的参数和局部变量。
● 每个模块用用自己的名字空间，叫做全局名字空间，它记录了模块的变量，包括函数、类、其它导入的模块、模块级别的
变量和常量。
● 还有内置名字空间，任何模块都可访问它，它存放着内置的函数和异常。

当一行代码要使用x变量的值时，Python会到所有可用的名字空间去查找变量，按照如下顺序：
1.局部名字空间：特指当前函数或类的方法。如果函数定义了一个局部变量x，或一个参数x，Python将使用它，然后停止搜索。
2.全局名字空间：特指当前的模块。如果模块定义了一个名为x的变量，函数或类，Python将使用它，然后停止搜索。
3.内置名字空间：对每个模块都是全局的。作为最后的尝试，Python将假设x是内置的函数或变量。
如果Python在这些名字空间中都找不到x，将会放弃查找并引发一个NameError异常，同时传递There is no variable named 'x'
这样一条信息。

from module import和import module之间的区别：使用import module，模块自身被导入，但是它保持着自己的名字空间，这就是
为什么需要使用模块名来访问它的函数或属性：module.function的原因。但是使用from module import，实际上是从另一个模块中
将指定的函数和属性导入到自己的名字空间中，所以可以直接访问它们却不需要引用它们所来源的模块。
@author: Administrator
'''

#===================================================
# locals：访问局部名字空间，locals是只读的。
# locals()返回的是局部名字空间的一个拷贝，所以对拷贝
# 所做的任何操作不会影响真正的局部名字空间。
#===================================================
def foo(arg):
    x = 1
    locals()['me'] = 'ME'
    print locals()
foo(7)
foo('bar')

#===================================================
# globals：访问全局名字空间，globals不是只读的。
# globals()返回的不是全局名字空间的拷贝，而是真正的
# 全局名字空间，所以对其进行的任何操作都会直接影响真正
# 的全局名字空间。
#===================================================
globals()['me'] = 'ME'
for k, v in globals().items():
    print k, " = ", v
